/**
 * Copyright (c) 2006-2015, JGraph Ltd
 * Copyright (c) 2006-2015, Gaudenz Alder
 */
/**
 * Class: mxGenericChangeCodec
 *
 * Codec for <mxValueChange>s, <mxStyleChange>s, <mxGeometryChange>s,
 * <mxCollapseChange>s and <mxVisibleChange>s. This class is created
 * and registered dynamically at load time and used implicitely
 * via <mxCodec> and the <mxCodecRegistry>.
 *
 * Transient Fields:
 *
 * - model
 * - previous
 *
 * Reference Fields:
 *
 * - cell
 *
 * Constructor: mxGenericChangeCodec
 *
 * Factory function that creates a <mxObjectCodec> for
 * the specified change and fieldname.
 *
 * Parameters:
 *
 * obj - An instance of the change object.
 * variable - The fieldname for the change data.
 */
var mxGenericChangeCodec = function (obj, variable) {
  var codec = new mxObjectCodec(obj, ["model", "previous"], ["cell"]);

  /**
   * Function: afterDecode
   *
   * Restores the state by assigning the previous value.
   */
  codec.afterDecode = function (dec, node, obj) {
    // Allows forward references in sessions. This is a workaround
    // for the sequence of edits in mxGraph.moveCells and cellsAdded.
    if (mxUtils.isNode(obj.cell)) {
      obj.cell = dec.decodeCell(obj.cell, false);
    }

    obj.previous = obj[variable];

    return obj;
  };

  return codec;
};

// Registers the codecs
mxCodecRegistry.register(mxGenericChangeCodec(new mxValueChange(), "value"));
mxCodecRegistry.register(mxGenericChangeCodec(new mxStyleChange(), "style"));
mxCodecRegistry.register(
  mxGenericChangeCodec(new mxGeometryChange(), "geometry")
);
mxCodecRegistry.register(
  mxGenericChangeCodec(new mxCollapseChange(), "collapsed")
);
mxCodecRegistry.register(
  mxGenericChangeCodec(new mxVisibleChange(), "visible")
);
mxCodecRegistry.register(
  mxGenericChangeCodec(new mxCellAttributeChange(), "value")
);
